package com.oig.sys.base.service.impl;

import com.oig.common.constants.CommonEnum;
import com.oig.common.exception.BadRequestException;
import com.oig.sys.base.dao.ITbEnumDao;
import com.oig.sys.base.dto.EnumDto;
import com.oig.sys.base.entity.TbEnum;
import com.oig.sys.base.entity.TbEnumItem;
import com.oig.sys.base.service.ITbEnumItemService;
import com.oig.sys.base.service.ITbEnumService;
import com.oig.sys.base.vo.EnumItemGroupVo;
import com.oig.sys.base.vo.EnumItemVo;
import com.oig.sys.base.vo.EnumVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @author wuxl
 */
@Slf4j
@Service
public class TbEnumServiceImpl implements ITbEnumService {

	private final ITbEnumDao tbEnumDao;
	private final ITbEnumItemService enumItemService;

	@Autowired
	public TbEnumServiceImpl(ITbEnumItemService enumItemService,
							 ITbEnumDao tbEnumDao){
		this.enumItemService = enumItemService;
		this.tbEnumDao = tbEnumDao;
	}


	@Transactional
	@Override
	public EnumVo addTbEnum(EnumDto enumDto) {
		TbEnum tbEnum = this.tbEnumDao.getByDictCode(enumDto.getDictCode()) ;
		if (tbEnum!=null){
			throw new BadRequestException("编码重复") ;
		}
		tbEnum = new TbEnum();
		BeanUtils.copyProperties(enumDto, tbEnum);
		tbEnum.setStatus(CommonEnum.CommonStatusEnum.OK.getCode());
		if (enumDto.getModifyFlag()==null){
			tbEnum.setModifyFlag(CommonEnum.FlagEnum.TRUE_FLAG.getCode());
		}
		this.tbEnumDao.save(tbEnum);
		List<EnumItemVo> enumItemVoList=this.enumItemService.addAllEnumItem(tbEnum.getId(), enumDto.getEnumItemList()) ;
		EnumVo enumVo = new EnumVo() ;
		BeanUtils.copyProperties(tbEnum, enumVo);
		enumVo.setEnumItemList(enumItemVoList);
		return enumVo;
	}


	@Transactional
	@Override
	public EnumVo updateTbEnum(EnumDto enumDto) {
		TbEnum tbEnum = this.tbEnumDao.getTbEnumById(enumDto.getId()) ;
		if (CommonEnum.FlagEnum.FALSE_FLAG.getCode().equals(tbEnum.getModifyFlag())){
			throw new BadRequestException("不允许修改");
		}
		BeanUtils.copyProperties(enumDto, tbEnum,"id");
		if (StringUtils.isBlank(tbEnum.getStatus())){
			tbEnum.setStatus(CommonEnum.CommonStatusEnum.OK.getCode());
		}
		this.tbEnumDao.save(tbEnum);
		List<EnumItemVo> enumItemVoList=this.enumItemService.updateAllEnumItem(tbEnum.getId(), enumDto.getEnumItemList()) ;
		EnumVo enumVo = new EnumVo() ;
		BeanUtils.copyProperties(tbEnum, enumVo);
		enumVo.setEnumItemList(enumItemVoList);
		return enumVo;
	}

	@Transactional
	@Override
	public void delEnum(Integer id) {
		TbEnum tbEnum = this.tbEnumDao.getTbEnumById(id);
		if (CommonEnum.FlagEnum.FALSE_FLAG.getCode().equals(tbEnum.getModifyFlag())){
			throw new BadRequestException("不允许删除");
		}
		this.enumItemService.delByDictId(tbEnum.getId());
		this.tbEnumDao.delete(tbEnum);
	}

	@Override
	public EnumVo getTbEnum(Integer id) {
		TbEnum tbEnum = this.tbEnumDao.getTbEnumById(id) ;
		return buildVo(tbEnum) ;
	}

	@Override
	public EnumVo getTbEnum(String dictCode) {
		TbEnum tbEnum = this.tbEnumDao.getByDictCode(dictCode);
		return buildVo(tbEnum) ;
	}

	private EnumVo buildVo(TbEnum tbEnum){
		if (tbEnum==null){
			throw new BadRequestException("error dictCode") ;
		}
		EnumVo enumVo = new EnumVo() ;
		BeanUtils.copyProperties(tbEnum, enumVo);
		enumVo.setEnumItemList(this.enumItemService.findAllEnumItemByDict(tbEnum.getId()));
		return enumVo;
	}


	@Override
	public List<EnumVo> listEnum(String searchKey) {
		return this.tbEnumDao.findAllByCodeOrName(searchKey);
	}

	@Override
	public Map<String, Map<String, EnumItemGroupVo>> getAllEnum() {
		List<TbEnum> enumList = this.tbEnumDao.findAllByStatus(CommonEnum.CommonStatusEnum.OK.getCode());
		List<TbEnumItem> enumItems = this.enumItemService.findAllItems();
		Map<String, Map<String, EnumItemGroupVo>> enumMap = new HashMap<>();
		for (TbEnum tbEnum : enumList){
			Map<String, EnumItemGroupVo> itemMap = new HashMap<>();
			for (Iterator<TbEnumItem> iterator=enumItems.iterator();iterator.hasNext();){
				TbEnumItem enumItem = iterator.next();
				if (enumItem.getDictId().equals(tbEnum.getId())){
					EnumItemGroupVo groupVo = new EnumItemGroupVo();
					groupVo.setName(enumItem.getItemName());
					groupVo.setGroup(enumItem.getGroupCode());
					itemMap.put(enumItem.getItemCode(), groupVo);
					iterator.remove();
				}
			}
			enumMap.put(tbEnum.getDictCode(), itemMap);
		}
		return enumMap;
	}


	@Override
	public Map<String, Map<String, String>> getAllEnumItem() {
		List<TbEnum> enumList = this.tbEnumDao.findAllByStatus(CommonEnum.CommonStatusEnum.OK.getCode());
		List<TbEnumItem> enumItems = this.enumItemService.findAllItems();
		Map<String, Map<String, String>> enumMap = new HashMap<>();
		for (TbEnum tbEnum : enumList){
			Map<String, String> itemMap = new HashMap<>();
			for (Iterator<TbEnumItem> iterator=enumItems.iterator();iterator.hasNext();){
				TbEnumItem enumItem = iterator.next();
				if (enumItem.getDictId().equals(tbEnum.getId())){
					itemMap.put(enumItem.getItemCode(), enumItem.getItemName());
					iterator.remove();
				}
			}
			enumMap.put(tbEnum.getDictCode(), itemMap);
		}
		return enumMap;
	}

}
